//
//  GGContactABViewController.m
//  ggtool
//
//  Created by engfei on 2017/5/4.
//  Copyright © 2017年 GaiGai. All rights reserved.
//

#import "GGContactABViewController.h"
#import <AddressBook/AddressBook.h>

@interface GGContactABViewController ()
@property (weak, nonatomic) IBOutlet UITextView *textView;

@end

@implementation GGContactABViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.textView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
    

}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    
    
    
}

// 获取联系人信息
- (IBAction)getContactInfo:(UIButton *)sender {
    
    ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus();
    // 判断状态
    switch (status) {
        case kABAuthorizationStatusNotDetermined: // 未进行授权选择
        {
            // 请求授权
            ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
            ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
                if (granted) { // 授权成功
                    [self getContact];
                } else { // 授权失败
                    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"授权失败" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
                    [alert show];
                }
            });
            CFRelease(addressBook);
        }
            break;
        case kABAuthorizationStatusRestricted: // 未授权，且用户无法更新，如家长控制情况下
        {
            
        }
            break;
        case kABAuthorizationStatusDenied:  // 用户拒绝
        {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"温馨提示" message:@"请您设置允许APP访问您的通讯录\n设置->隐私->通讯录" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
            
            [alert show];
        }
            break;
        case kABAuthorizationStatusAuthorized: // 已授权
        {
            [self getContact];
        }
            break;
            
        default:
            break;
    }
    
 
    
}


// other
- (IBAction)other:(UIButton *)sender {
    
}

// 获取联系人
- (void)getContact {
    
    // ABRecordRef 联系人属性的集合
    // ABAddressBookRef 通讯录操作对象
    CFErrorRef error = nil;
    ABAddressBookRef abref = ABAddressBookCreateWithOptions(NULL, &error);
    NSMutableString *str = [NSMutableString string];
    ABAddressBookRequestAccessWithCompletion(abref, ^(bool granted, CFErrorRef error) {
        
        if (granted) {
            // 获取所有联系人
            CFArrayRef allPerson = ABAddressBookCopyArrayOfAllPeople(abref);
            CFIndex personCount = CFArrayGetCount(allPerson);
            
            for (CFIndex i = 0; i < personCount; i++) {
                
                // 联系人姓名
                ABRecordRef person = CFArrayGetValueAtIndex(allPerson, i);
                NSString *firstName = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonFirstNameProperty));
                NSString *lastName = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonLastNameProperty));
                TFLog(@"firstName = %@, lastName = %@", firstName, lastName);
//                [str appendString:[NSString stringWithFormat:@"name = %@ + %@\n", firstName, lastName]];
                // 联系人手机号
                ABMultiValueRef multivals = ABRecordCopyValue(person, kABPersonPhoneProperty);
                CFIndex phoneCount = ABMultiValueGetCount(multivals);
                
                for (CFIndex j = 0; j < phoneCount; j++) {
                    NSString *phoneValue = (__bridge NSString *)(ABMultiValueCopyValueAtIndex(multivals, j));
//                    TFLog(@"phoneNumber = %@", phoneValue);
                    [str appendString:[NSString stringWithFormat:@"number = %@\n", phoneValue]];
                    
                }
                
            }
            dispatch_async(dispatch_get_main_queue(), ^{
                self.textView.text = str;
            });
            
        } else {
            
        }
    });
   
    
   
    
    
    
}

#pragma mark - 知识小节
// GCD 信号量控制并发 （dispatch_semaphore）
//当我们在处理一系列线程的时候，当数量达到一定量，在以前我们可能会选择使用NSOperationQueue来处理并发控制，
//但如何在GCD中快速的控制并发呢？答案就是dispatch_semaphore，对经常做unix开发的人来讲，
//我所介绍的内容可能就显得非常入门级了，信号量在他们的多线程开发中再平常不过了
/**
 信号量是一个整形值并且具有一个初始计数值，并且支持两个操作：信号通知和等待。当一个信号量被信号通知，其计数会被增
 加。当一个线程在一个信号量上等待时，线程会被阻塞（如果有必要的话），直至计数器大于零，然后线程会减少这个计数。
 在GCD中有三个函数是semaphore的操作，分别是：
dispatch_semaphore_create　　　创建一个semaphore
dispatch_semaphore_signal　　　发送一个信号
dispatch_semaphore_wait　　　　等待信号
简单的介绍一下这三个函数，第一个函数有一个整形的参数，我们可以理解为信号的总量，dispatch_semaphore_signal是发
送一个信号，自然会让信号总量加1，dispatch_semaphore_wait等待信号，当信号总量少于0的时候就会一直等待，否则就
可以正常的执行，并让信号总量-1，根据这样的原理，我们便可以快速的创建一个并发控制来同步任务和有限资源访问控制。
 */
- (void)knowledgeSection {
    
    dispatch_group_t group = dispatch_group_create();
    
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(10);
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    for (int i = 0; i < 100; i++) {
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_group_async(group, queue, ^{
            NSLog(@"%d", i);
            NSLog(@"thread = %@", [NSThread currentThread]);
            dispatch_semaphore_signal(semaphore);
        });
    }
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

    /**
     说明:创建了一个初使值为10的semaphore，每一次for循环都会创建一个新的线程，线程结束的时候会发送一个信号，线程创建之前会信号等待，所以当同时创建了10个线程之后，for循环就会阻塞，等待有线程结束之后会增加一个信号才继续执行，如此就形成了对并发的控制，如上就是一个并发数为10的一个线程队列。
     */
    
}



@end
